# 本章节研究是 使用面向对象的方式 读取文件的数据

"""
需求:
某公司，有两份销售数据，现在要分析其数据，并计算每日的销售额 并以柱状图的形式展示出来

文件内容：
1月份数据是普通文本，使用逗号分割数据记录，从前到后分别是（日期，订单id，销售额，销售省份）
2月份数据是JSON数据，同样包含（日期，订单id，销售额，销售省份）

思路分析：
第一步：先读文件数据,
第二步：解析数据，然后封装数据对象
第三步：计算数据对象
第四步：绘图

"""
import json


# 定义一个是实体类
class Record:
    data = None  # 订单日期
    order_id = None  # 订单id
    money = None  # 订单金额
    province = None  # 销售省份

    # 构造方法
    def __init__(self, data, order_id, money, province):
        self.data = data  # 订单日期
        self.order_id = order_id  # 订单id
        self.money = money  # 订单金额
        self.province = province  # 销售省份

    # 类似于toString方法
    def __str__(self):
        return f"{self.data},{self.order_id},{self.money},{self.province}"


# 定义一个读取文件的类
class FileReader:
    # 定义一个方法 读取文件资源 并返回实体对象
    def read_data(self) -> list[Record]:
        """读取文件的数据，读到的每一条数据都转换为Record对象，将它们都封装到list内返回即可"""
        pass



# 定义一个文本文件读取类，继承父类
class TextFilReader(FileReader):

    # 构造方法
    def __init__(self, path):
        self.path = path

    # 重写父类的方法
    def read_data(self) -> list[Record]:
        # f_jp = open("/02_pyecharts_test/file/日本.txt", "r", encoding="UTF-8")
        f = open(self.path, "r", encoding="UTF-8")  # 读取文本文件

        record_list: list[Record] = []  # 定义一个空集合
        for line in f.readlines():  # 读取每一行数据
            line = line.strip()  # 消除每行的空格
            data_list = line.split(",")  # 根据逗号分割
            record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
            record_list.append(record)

        f.close()
        return record_list



# 定义个读取json文件的类
class JsonFileReader(FileReader):
    # 构造方法
    def __init__(self, path):
        self.path = path  # 定义成员变量

    # 读取数据
    def read_data(self) -> list[Record]:
        f = open(self.path, "r", encoding="UTF-8")  # 读取指定文件的数据

        record_list: list[Record] = []  # 定义空集合用来收集每一个对象
        for line in f.readlines():
            data_dict = json.loads(line)  # 将json格式的数据转换为python格式的数据
            print(type(data_dict))
            record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
            record_list.append(record)

            # 关闭流资源
        f.close()
        return record_list




print("---------------service层-----------------------------")


"""
Bar: 绘图工具
options: 参数比例
ThemeType: 主题类型
"""

from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType

# D:\work_space\unit-test\hello_python\03_面向对象\file\2011年1月销售数据.txt
#定义两个文件对象
# D:\work_space\unit-test\hello_python\03_面向对象\file\2011年1月销售数据.txt
text_file_reader=TextFilReader("/03_面向对象/file/2011年1月销售数据.txt")
json_file_reader=JsonFileReader("/03_面向对象/file/2011年2月销售数据JSON.txt")


#读取数据
jan_data:list[Record]=text_file_reader.read_data()
feb_data:list[Record]=json_file_reader.read_data()

# 将2个月分的数据合并为1个list来存储
all_data:list[Record]=jan_data+feb_data

#开始进行数据计算
data_dict={}
for record in all_data:
    if record.data in data_dict.keys(): # 这是一个判断语句,用来判断 recprd.data里面的值是否存在于data_dict.keys()里面
        # 当前日期已经有记录 所以要和老记录做累加
        data_dict[record.data]+=record.money
    else:
        data_dict[record.data]=record.money


# 创建可视化对象
bar=Bar(init_opts=InitOpts(theme=ThemeType.LIGHT)) # 设置主题为高亮
# 添加x轴
bar.add_xaxis(list(data_dict.keys()))
# 添加y轴
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))

bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")

)

bar.render("D:/work_space/unit-test/hello_python/03_面向对象/html/每日销售额柱状图.html")
